﻿// ## 2023/05/03 # 江东新风 # 函数主体自305迁回 ##
// ## 2022/11/01 # 铃 # 在新的自动化内政中,训练也成为自动化,为新的内政系统设定参数和算法 ##
// ## 2022/08/14 # 铃 # 在新的人口系统中,训练的逻辑也发生了很大变化,重做相关函数。 ##
// ## 2021/10/01 # 江东新风 # namespace的韩文改成英文 ##
// ## 2021/09/15 # 江东新风 # 更改pk::core[]函数为英文##
// ## 2020/10/23 #江东新风#新特技 调练##
// ## 2020/07/26 ##

namespace DRILL
{
	// ================ 自动内政全局常量================

	class Main
	{
		Main()
		{
			pk::set_func(105, pk::func105_t(callback));
		}

		int callback(pk::building @building, const pk::detail::arrayptr<pk::person @> &in actors)
		{
			pk::list<pk::person @> actor_list;
			for (int i = 0; i < actors.length; i++)
			{
				actor_list.add(actors[i]);
			}

			return get_drill_energy_change(building, actor_list);
		}

	}

	Main main;

	int get_drill_energy_change(pk::building @building, pk::list<pk::person @> actors)
	{
		if (!pk::is_alive(building) or actors[0] is null)
			return 0;

		float n = 0;
		int max = pk::INT32_MIN;
		bool flag = false;

		for (int i = 0; i < actors.count; i++)
		{
			pk::person @actor = actors[i];
			if (pk::is_alive(actor))
			{
#if param_set
				int s = actor.stat[pk::get_drill_param().stat];			
#endif
#if not_param_set
				int s = actor.stat[int(pk::core["train.stat"])];
#endif
				n += s;
				max = pk::max(max, s);
				if (ch::has_skill(actor, 特技_调练))
					flag = true;
			}
		}

		float exp_eff = 1.0f;
		float absent_eff = 1.0f;
		float expend_eff = 1.0f;
		bool is_auto_affairs = auto_inner::is_auto_affairs(building, actors);
		int service_id = actors[0].service;
		if (is_auto_affairs) // 只有在人数为1，开启自动内政，且有执政官经验时享受加成
		{
			// exp_eff = main.get_exp_eff(actors[0].get_id());
			exp_eff = auto_inner::get_exp_eff(actors[0].get_id(), 内政自动化_训练);
			absent_eff = auto_inner::get_absent_eff(actors[0], 内政自动化_训练);


			if (pk::is_valid_base_id(service_id))
			{
				auto building_p = ch::get_baseIA(service_id);

				// 由于一个人训练的效果明显差太多,会导致玩家的士气补不上来,因此给予一定的补正
				float rate = float(building_p.train_effic) / 100 * 2 * 1.2; // 执政官经验倍率由于无法互动而降低了,在这里暂时补上这部分损失的值
				expend_eff = pk::min(3.0f, rate);
			}
		}

		n = int((n + max) * exp_eff * absent_eff * expend_eff / pk::min(building.get_troops() / 2000 + 20, 100) + 1);

		if (is_auto_affairs and ch::get_baseIA(service_id).train_effic == 0)
			n = 0;

		// 연병소가 있다면 1.5배
		if (building.facility == 设施_都市 and pk::has_facility(pk::building_to_city(building), 设施_练兵所))
			n = n * 1.5f;
		if (flag)
			n = n * pk::core::skill_constant_value(特技_调练) / 100;

		// 兵临城下训练效果仅有一半
		if (pk::enemies_around(building))
		{
			n = n * 兵临城下时训练倍率 / 100;
		}
		// if (!building.is_player())
		// 	n *= 2; // ai优待

		return int(n);
	}
}